package com.example.d6_homework.homework06.context;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Collection;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 实现ApplicationContext接口的类,用于管理Bean的生命周期和依赖关系
 */
public class ClasspathApplicationContext implements ApplicationContext {

    // 定义一个容器存储系统中可能使用到的对象
    private ConcurrentHashMap<String, Object> beans = new ConcurrentHashMap<>();

    /**
     * 构造方法,根据配置文件名初始化Bean容器
     *
     * @param fileName 配置文件名,包含Bean的配置信息
     */
    public ClasspathApplicationContext(String fileName) {
        Properties properties = new Properties();
        try {
            // 加载配置文件
            properties.load(new FileInputStream(fileName));
        } catch (IOException e) {
            e.printStackTrace();
        }
        // 遍历配置文件中的属性,创建Bean实例并存入容器
        for (String key : properties.stringPropertyNames()) {
            String className = properties.getProperty(key);
            try {
                Class c = Class.forName(className);
                Object bean = c.getDeclaredConstructor().newInstance();
                beans.put(key, bean);
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

    /**
     * 根据Class类型获取Bean实例
     *
     * @param clazz 要获取的Bean的Class类型
     * @param <T>   泛型参数,表示Bean的类型
     * @return 返回指定类型的Bean实例, 如果找不到则抛出异常
     */
    @Override
    public <T> T getBean(Class<T> clazz) {
        // 遍历Bean容器,查找匹配的Bean
        for (String key : beans.keySet()) {
            Object bean = beans.get(key);
            if (clazz.isInstance(bean)) {
                return clazz.cast(bean);
            }
        }
        // 如果没有找到匹配的bean,则抛出异常或返回null
        throw new RuntimeException("No bean found for class: " + clazz.getName());
    }
}
